package main.leetcode.clockin.April;

import java.util.Arrays;

/**
 * 面试题56-I.数组中数字出现的次数
 *
 * <p>一个整型数组 nums 里除两个数字之外，其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)，空间复杂度是O(1)。
 *
 * <p>
 *
 * <p>示例 1：输入：nums = [4,1,4,6] 输出：[1,6] 或 [6,1]
 *
 * <p>示例 2：输入：nums = [1,2,10,4,1,4,3,3] 输出：[2,10] 或 [10,2]
 *
 * <p>限制：2 <= nums <= 10000
 *
 * <p>来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class day28 {
    public static void main(String[] args) {
        System.out.println(
                Arrays.toString(new day28().singleNumbers(new int[] {1, 2, 10, 4, 1, 4, 3, 3})));
    }

    public int[] singleNumbers(int[] nums) {
        int t = 0;
        for (int num : nums) {
            t ^= num;
        }
        int a = t & -t;
        int A = 0;
        for (int num : nums) {
            if ((a & num) == a) {
                A ^= num;
            }
        }
        return new int[] {A, t ^ A};
    }
}
